package com.ccll.service;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.ccll.domain.dto.PageDto;
import com.ccll.domain.po.File;
import org.springframework.web.multipart.MultipartFile;

import java.util.List;
import java.util.Map;

/**
 * @author Seon
 * @date 2022/11/12 20:44
 */
public interface FileService extends IService<File> {
    /**
     * 获取文件页，可能会被废弃掉。
     *
     * @param pageDto
     * @param userId
     * @return
     */
    Page<File> getFilePage(PageDto pageDto, Long userId);

    /**
     * 上传文件
     *
     * @param file
     * @return 文件的真实索引路径，供存库使用。
     */
    String uploadFile(MultipartFile file);

    /**
     * 获取用户的文件夹
     *
     * @param initPath 要查询的文件夹
     * @return 当前用户的当前路径的文件夹。
     */
    List<File> getUserFolder(String initPath);

    /**
     * 根据文件类型来检索对应的文件。
     *
     * @param pageDto
     * @param type    文件类型
     * @return 文件分类的列表
     */
    Page<File> getFileByType(PageDto pageDto, String type);

    /**
     * 获取文件夹信息
     *
     * @param id 文件夹id
     * @return 值为{file，该文件夹下所有的子文件夹的个数和大小。}
     */
    Map<String, Object> getFolderInformation(Long id);


    /**
     * 条件搜索文件（通过userId， filename， 还有文件类型）
     *
     * @param userId
     * @param filename
     * @param type
     * @return
     */
    List<File> searchFileCondition(String userId, String filename, String type);

    /**
     * 删除文件夹
     *
     * @param folderPath
     * @return
     */
    boolean deleteFolder(String folderPath);

    /**
     * 判断文件真实路径是否被利用
     *
     * @param judgePath
     * @return
     */
    boolean isRealPathReference(String judgePath);

    /**
     * 复制文件
     *
     * @param originPath
     * @param targetPath
     * @return
     */
    boolean copy(String originPath, String targetPath);

    /**
     * 重命名文件或者文件夹
     *
     * @param originName 原始名称 例如 /wang/hua
     * @param targetName 更改名称 例如 /wang/dangdang
     * @return
     */
    boolean rename(String originName, String targetName);


    /**
     * 恢复文件，包括其自身所在的文件夹。
     * @param id
     * @return
     */
    boolean recoveryFile(Long id);
}
